#ifndef __LIB_KERNEL_VIRTUAL_PIT8253_H
#define __LIB_KERNEL_VIRTUAL_PIT8253_H
#include "stdint.h"                 //我们的stdint.h中定义了数据类型，包含进来
#include "global.h"

// 8253寄存器端口
#define PIT_CTRL_REG 0x43
#define PIT_COUNTER0 0x40
#define PIT_COUNTER1 0x41
#define PIT_COUNTER2 0x42
// 8253计数器模式
#define MODE0 0x00 // 计数结束停止，输出保持0
#define MODE1 0x02 // 计数结束停止，输出反转
#define MODE2 0x04 // 计数结束重置，输出保持当前状态
#define MODE3 0x06 // 计数结束重置，输出反转
#define MODE4 0x08 // 计数结束重置，输出保持0
#define MODE5 0x0A // 计数结束重置，输出保持1

struct PIT_COUNTER {
    unsigned short init_value; // 当前计数值
    unsigned char mode;   // 计数器模式
    bool is_running;      // 是否正在运行
};
// 8253模拟结构体
struct PIT8253{
    struct PIT_COUNTER counter[3]; // 三个计数器
};

void init8253(struct PIT8253* pit);

void pit_write_control(unsigned char control, struct PIT8253* pit);

void pit_write_counter(unsigned char port, unsigned short value, struct PIT8253* pit);

#endif
